home *** CD-ROM | disk | FTP | other *** search
- Path: sun001.spd.dsccc.com!spd!jmccarty
- From: jmccarty@spd.dsccc.com (Mike McCarty)
- Newsgroups: comp.lang.c
- Subject: Re: How to tell if a file exists in C
- Date: 9 Feb 1996 00:23:36 GMT
- Organization: DSC Communications Corporation, Plano, Texas USA
- Message-ID: <4fe468$h31@sun001.spd.dsccc.com>
- References: <823685019.AA00170@escan.demon.co.uk>
- NNTP-Posting-Host: aplo139.spd.dsccc.com
-
- In article <823685019.AA00170@escan.demon.co.uk>,
- Bill Birrell <bill@escan.demon.co.uk> wrote:
- ) > Hi, how do I find out if a file already exists
- ) > in UNIX C? On PCs I would do a findfirst/findnext,
- ) > is there an equivalent on Unix?
- )
- ) Check up on access() and stat(). There cannot be an exact equivalent to
- )Digital Research's findfirst and findnext functions in unix, because unix has
- )a completely different file structure from CP/M or PC-Dos (later MsDos), and
- )therefore has no idea what FCBs are. Files, directories and devices are all
- )accessed the same way, and when you become used to it, it is a *much* simpler
- )and more logical approach. Take a look at K&R Chapter 8 [Either edition - it's
- )in both].
- )
- )Bill.
-
- The easiest way to determine whether a file is accessible is to open it
- with read access. If the open fails, then the file does not exist. If
- what you want to do is -search- for a file, then you need to call
- opendir(), readdir(), and closedir(). Look at the man pages
-
- ---------------------------------------------------------------------
-
- DIRECTORY(3) BSD DIRECTORY(3)
-
-
-
- NAME
- opendir, opendir_r, readdir, readdir_r, telldir, seekdir, rewinddir,
- closedir - directory operations
-
- SYNOPSIS
- #include <sys/types.h>
- #include <sys/dir.h>
-
- DIR *opendir(filename)
- char *filename;
-
- int opendir_r (dir_name, dir_pointer)
- const char *dir_name;
- DIR *dir_pointer;
-
- struct direct *readdir(dirp)
- DIR *dirp;
-
- int readdir_r (dir_pointer, result)
- DIR *dir_pointer;
- struct dirent *result;
-
- long telldir(dirp)
- DIR *dirp;
-
- seekdir(dirp, loc)
- DIR *dirp;
- long loc;
-
- rewinddir(dirp)
- DIR *dirp;
-
- closedir(dirp)
- DIR *dirp;
-
- DESCRIPTION
- opendir opens the directory named by filename and associates a
- "directory"stream with it. opendir returns a pointer to be used to
- identify the directory stream in subsequent operations. The pointer NULL
- is returned if filename cannot be accessed, or if it cannot malloc(3)
- enough memory to hold the whole thing.
-
- readdir returns a pointer to the next directory entry. It returns NULL
- upon reaching the end of the directory or detecting an invalid seekdir
- operation.
-
- telldir returns the current location associated with the named directory
- stream.
-
- seekdir sets the position of the next readdir operation on the directory
- stream. The new position reverts to the one associated with the
- directory stream when the telldir operation was performed. Values
- returned by telldir are good only for the lifetime of the DIR pointer
- from which they are derived. If the directory is closed and then
- reopened, the telldir value may be invalidated due to undetected
- directory compaction. It is safe to use a previous telldir value
- immediately after a call to opendir and before any calls to readdir.
-
- rewinddir resets the position of the named directory stream to the
- beginning of the directory.
-
- closedir closes the named directory stream and frees the structure
- associated with the DIR pointer.
-
- Sample code that searchs a directory for entry "name" is
-
- len = strlen(name);
- dirp = opendir(".");
- for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
- if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
- closedir(dirp);
- return FOUND;
- }
- closedir(dirp);
- return NOT_FOUND;
-
- NOTES
- The opendir_r and readdir_r functions are the reentrant versions of the
- opendir and readdir functions, respectively. The opendir_r function
- stores the new directory stream associated with dir_name at dir_pointer.
- The readdir_r function stores the next directory entry at result.
-
- Upon successful completion, the opendir_r function returns 0 (zero).
- Otherwise, -1 is returned.
-
- Upon successful completion, the readdir_r function returns 0 (zero).
- Otherwise, -1 is returned.
-
- SEE ALSO
- open(2), close(2), read(2), lseek(2), dir(5)
-
- ----
- char *p="char *p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}
-
- I don't speak for DSC. <- They make me say that.
-